package main

import "fmt"

/*
Go里面提供了一个关键字select，通过select可以监听channel上的数据流动
有时候我们希望能够借助channel发送或接收数据，并避免因为发送或者接收导致的阻塞，尤其是当channel没有准备好写或者读时。
select语句就可以实现这样的功能。
select的用法与switch语言非常类似，由select开始一个新的选择块，每个选择条件由case语句来描述。
与switch语句相比，select有比较多的限制，其中最大的一条限制就是每个case语句里必须是一个IO操作，大致的结构如下
*/
func main() {
	c := make(chan int)
	quit := make(chan int)

	go func() {
		for i := 0; i < 6; i++ {
			fmt.Println(<-c)
		}
		quit <- 0
	}()

	fibonacci(c, quit)
}

func fibonacci(c chan int, quit chan int) {
	x, y := 1, 1
	for {
		select {
		case c <- x:
			x, y = y, x+y
		case <-quit: //quit为空，接收和发送都会被阻塞;如果quit成功读到数据，则进行该case处理语句,否则会阻塞
			fmt.Println("quit")
			return
		}
	}
}
